package com.bdqn.verify;

import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * ServiceVerify
 *
 * @author LILIBO
 * @since 2021-10-19
 */
@Aspect
@Component
public class ServiceVerify {

    private Logger logger = Logger.getLogger(ServiceVerify.class);

    /**
     * 环绕增强方法，此方法完全代理目标方法（可使用ProceedingJoinPoint对象的proceed(jp.getArgs())调用目标方法）执行
     *
     * @param jp
     */
    // @Around("execution(* com.bdqn.service..*.*(..))")
    public Object around(ProceedingJoinPoint jp) throws Throwable {
        logger.debug("============== 进入了 " + jp.getSignature().getName() + " 方法 ==============");
        logger.debug("参数是：" + Arrays.toString(jp.getArgs()));
        try {
            Object[] objects = jp.getArgs();
            // 取出第一个参数;
            // 根据要求判断参数是否合法
            if (objects[0] == null) {
                logger.debug("参数验证不通过：[参数为null]，不调用目标方法");
                throw new RuntimeException(); // 这里通常抛出一个自定义异常
            } else {
                logger.debug("参数验证通过，调用目标方法");
                // 执行目标方法并获得返回值（调用真正的方法）
                Object result = jp.proceed(jp.getArgs());
                logger.info("============== " + jp.getSignature().getName() + " 方法执行完毕，返回值是：" + result);
                return result;
            }
        } catch (Throwable e) {
            logger.error("============== " + jp.getSignature().getName() + " 方法发生了异常，异常信息：" + e);
            throw e;
        } finally {
            logger.info("============== (finally) " + jp.getSignature().getName() + " 方法执行结束，清理资源 ==============");
        }
    }

}
